#define _CRT_SECURE_NO_WARNINGS

//https://leetcode.cn/problems/univalued-binary-tree/description/
///**
// * Definition for a binary tree node.
// * struct TreeNode {
// *     int val;
// *     struct TreeNode *left;
// *     struct TreeNode *right;
// * };
// */
//
//bool isUnivalTree(struct TreeNode* root)
//{
//    if (!root)
//    {
//        return true;
//    }
//    if (root->left && root->left->val != root->val)
//    {
//        return false;
//    }
//    if (root->right && root->right->val != root->val)
//    {
//        return false;
//    }
//    return isUnivalTree(root->left) && isUnivalTree(root->right);
//}

//https://leetcode.cn/problems/same-tree/
///**
// * Definition for a binary tree node.
// * struct TreeNode {
// *     int val;
// *     struct TreeNode *left;
// *     struct TreeNode *right;
// * };
// */
//bool isSameTree(struct TreeNode* p, struct TreeNode* q)
//{
//    if (!p && !q)
//    {
//        return true;
//    }
//    else if (p && q)
//    {
//        if (p->val == q->val)
//        {
//            return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
//        }
//        else
//        {
//            return false;
//        }
//    }
//    else
//    {
//        return false;
//    }
//}


///**
// * Definition for a binary tree node.
// * struct TreeNode {
// *     int val;
// *     struct TreeNode *left;
// *     struct TreeNode *right;
// * };
// */
//bool isSame(struct TreeNode* p, struct TreeNode* q)
//{
//    if (!p && !q)
//    {
//        return true;
//    }
//    else if (p && q)
//    {
//        if (p->val != q->val)
//        {
//            return false;
//        }
//        return isSame(p->left, q->left) && isSame(p->right, q->right);
//    }
//    else
//    {
//        return false;
//    }
//}
//bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
//{
//    if (!subRoot)
//    {
//        return true;
//    }
//    if (!root)
//    {
//        return false;
//    }
//    if (isSame(root, subRoot))
//    {
//        return true;
//    }
//    return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
//}

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>


typedef struct TreeNode
{
	char val;
	struct TreeNode* left;
	struct TreeNode* right;
}TreeNode;

TreeNode* NewNode(char val)
{
	TreeNode* newnode = malloc(sizeof(TreeNode));
	newnode->val = val;
	newnode->left = newnode->right = NULL;
	return newnode;
}

TreeNode* CreateTree(char* string, int* i)
{
	if (string[*i] == '#')
	{
		(*i)++;
		return NULL;
	}
	TreeNode* ret = NULL;
	ret = NewNode(string[*i]);
	(*i)++;
	ret->left = CreateTree(string, i);
	ret->right = CreateTree(string, i);

	return ret;
}

void InOrder(TreeNode* root)
{
	if (!root)
	{
		return;
	}
	else
	{
		InOrder(root->left);
		printf("%c ", root->val);
		InOrder(root->right);
		return;
	}
}

int main()
{
	TreeNode* root = NULL;
	int i = 0;
	char string[100] = "";

	scanf("%s", string);
	root = CreateTree(string, &i);
	InOrder(root);

	return 0;
}